import type { Section } from "./recommend-result";
import type { ChatSession } from "./session";

// 角色 ASSISTANT 系统消息 USER 用户请求消息
type Role = 'ASSISTANT' | 'USER';

// 消息类型 text 文本 section 模块 outline 大纲 pid 页面id REQUEST 请求信息
type ContentType = 'TEXT' | 'SECTION' | 'OUTLINE' | 'PID' | 'STATUS_CHANGE' | 'REQUEST' | 'RAG_CONTENT' | 'RAG_SOURCE' | 'INSIGHT_CONFIG';


export interface ChatFeedback {
  // 会话id
  ask_id: string;
  // 点赞/点踩
  like: 0 | 1;
  // 反馈内容
  feedback: {
    type: string,
    content: string
  } | null;
}

// 引用（用于问句推荐、对话）
export interface RefrenceResource {
  // 引用类型 section 模块 index 指标 panel 页面
  type: "PANEL" | 'SECTION' | 'INDEX' | 'CHAT';
  // 会话id
  ask_id?: string | null;
  // 选中类型名称
  select_title?: string | null;
  // 选中内容
  select_content?: string | null;
  // 页面id
  pid?: string | null;
  // 页面tab名称
  panel_name?: string | null;
  // 模块id
  sid?: string | null;
  // 模块名称
  section_name?: string | null;
  // 引用数据（表格类型）
  data?: {
    // 选中key
    key: string;
    // 选中值
    value: string;
    // 选中数据索引
    dataIndex: number;
  }[] | null;
}

// 问句类型消息（用户发送）
export interface QueryMessage {
  // 问句
  query: string;
  // 会话请求类型
  action: 'CREATE' | 'REFRESH';
  // 引擎类型
  engine?: string;
  // 扩展信息 如sid pid 等
  extension?: Record<string, any>;
  // 引用类型 section 模块 index 指标
  ref?: RefrenceResource | null;
  // 请求id
  request_id?: string;
  // session id
  session_id: string;
  // group session id
  group_session_id?: string;
  // 用户id
  user_id?: string;
  // 指令id
  command_id?: string | null;
}

// 文本消息
export interface TextMessage {
  // 文本内容
  content: string;
}

// Rag源
export interface RAGSource {
  // 下标？
  index: number;
  // 跳转类型
  jump_type: string;
  // 简介
  summary: string;
  // 标题
  title: string
  // 访问地址
  url: string;
}

// 状态变更消息
export interface StatusMessage {
  // 当前状态
  current: string;
  // 描述
  description: string;
  // 原因
  reason: string;
}

export interface RecommendQuestion {
  // 问题列表
  questions: string[];
}

// 可视化洞察配置
export interface InsightConfig {
  config: {
    data: {
      summary: string;
      x: string;
      x_end: string;
      x_start: string;
      y: string;
    }[],
    description: string;
    type: string;
  }[];
  param: {
    sid: string;
    view_index: number;
    visual_index: number;
  }
}

// 消息项
export class Message {
  // 本轮会话id
  ask_id: string;

  // 消息类型
  type: ContentType;

  // 消息内容
  body: QueryMessage | TextMessage | StatusMessage | Section | RecommendQuestion | RAGSource[] | InsightConfig;

  // 消息id 本条消息id
  id: string;

  // 创建时间
  create_at: string;

  // 元数据
  meta_data: Record<string, any>;

  // 角色
  role: Role;

  // session id
  session_id: string;

  // 是否结束
  end: boolean;

  // 默认创建问句消息
  constructor(session_id: string, role: Role, body: QueryMessage | TextMessage | StatusMessage | Section) {
    this.ask_id = '';
    this.type = 'TEXT';
    this.body = body;
    this.id = '';
    this.create_at = '';
    this.meta_data = {};
    this.role = role;
    this.session_id = session_id;
    this.end = true;
  }

  // 更新本轮会话id
  updateAskId(askId: string): void {
    this.ask_id = askId;
  }

  // 更新消息类型
  updateType(type: ContentType): void {
    this.type = type;
  }

  // 更新消息内容
  updateBody(body: QueryMessage | TextMessage | StatusMessage | Section): void {
    this.body = body;
  }

  // 更新消息id
  updateId(id: string): void {
    this.id = id;
  }

  // 更新创建时间
  updateCreateAt(createAt: string): void {
    this.create_at = createAt;
  }

  // 更新元数据
  updateMetaData(metaData: Record<string, any>): void {
    this.meta_data = metaData;
  }

  // 更新角色
  updateRole(role: Role): void {
    this.role = role;
  }

  // 更新session id
  updateSessionId(sessionId: string): void {
    this.session_id = sessionId;
  }

  // 更新是否结束
  updateEnd(end: boolean): void {
    this.end = end;
  }

  // 更新所有属性方法
  updateAllProperties(
    askId: string,
    type: ContentType,
    body: QueryMessage | TextMessage | StatusMessage | Section,
    id: string,
    createAt: string,
    metaData: Record<string, any>,
    role: Role,
    sessionId: string,
    end: boolean
  ): void {
    this.updateAskId(askId);
    this.updateType(type);
    this.updateBody(body);
    this.updateId(id);
    this.updateCreateAt(createAt);
    this.updateMetaData(metaData);
    this.updateRole(role);
    this.updateSessionId(sessionId);
    this.updateEnd(end);
  }

}

// 会话消息 包含多条消息项
export class ChatMessages {
  // 角色
  role: Role;
  // 消息内容列表 当为用户时应只有一条
  messages: Message[];
  // 会话id
  id: string;
  // 点赞
  like?: 0 | 1 | -1;
  // 点踩
  dislike?: boolean;
  // 组id
  group_session_id?: string;
  // 是否会话中的第一条消息
  first?: boolean;
  constructor(role: Role, messages: Message[], id?: string) {
    this.role = role;
    this.messages = messages;
    this.id = id || 'latest';
  }
}

// 聊天历史
export interface ChatHistory {
  // 会话session信息
  session: ChatSession;
  // 聊天消息列表
  messages: ChatMessages[];
}